# import asyncio

# async def main():               # 定义 协程函数
#     print("Hello")
#     await asyncio.sleep(10)      # 阻塞协程, 但不阻塞线程
#     print("World")

# asyncio.run(main())             # 运行协程（Python 3.7+）


# import asyncio

# async def main():
#     await asyncio.sleep(1)
#     print("Hello World")
#     return "main over"

# ret = asyncio.run(main())   # run() 函数执行完的返回结果为 main() 协程函数的返回结果
# print(ret)                  # 输出: "main over"


# import asyncio

# async def delay_print(time, text):  # 定义 协程函数
#     await asyncio.sleep(time)
#     print(text)

# async def main():                   # 定义 协程函数（主入口函数）
#     print("main start")

#     # 将协程封装为任务, 协程 将立即被 异步运行, create_task() 函数立即返回, 不阻塞
#     task1 = asyncio.create_task(delay_print(2, "Hello"))
#     task2 = asyncio.create_task(delay_print(3, "World"))

#     print("task create complete")

#     await task1                     # 等待任务完成（阻塞）
#     await task2                     # 等待任务完成（阻塞）
    
#     # await 语句返回结果为任务对应的协程函数 delay_print() 的返回值

#     print("main end")

# asyncio.run(main())                 # 运行协程（的主函数）

# print("over")


import asyncio


async def delay_print(time, text):  # 定义 协程函数
    await asyncio.sleep(time)
    print(text)
    return f"PRINT: {text}"


async def main():  # 定义 协程函数（主入口函数）
    # 创建协程对象（不会自动调度运行）
    task1 = delay_print(1, "ABC")
    task2 = delay_print(3, "DEF")
    task3 = delay_print(3, "UVW")

    # 创建任务（会自动立即异步运行）
    task4 = asyncio.create_task(delay_print(5, "XYZ"))

    # 并发异步运行多个任务
    # task1, task2, task3 协程将作为任务被调度运行
    # task4 任务等待运行完毕
    all_task = asyncio.gather(task1, task2, task3, task4)

    # 等待所有并发任务的运行完毕（一共需要 5 秒）
    rets = await all_task

    print(rets)     # 输出: ['PRINT: ABC', 'PRINT: DEF', 'PRINT: UVW', 'PRINT: XYZ']


asyncio.run(main())  # 运行协程（的主函数）


